# Copyright 1998-2004 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id: output.py,v 1.1 2006/03/06 18:13:31 henrique Exp $


import os,sys,re

havecolor=1
dotitles=1

spinpos = 0
spinner = "/-\\|/-\\|/-\\|/-\\|\\-/|\\-/|\\-/|\\-/|"

esc_seq = "\x1b["

g_attr = {}
g_attr["normal"]       =  0

g_attr["bold"]         =  1
g_attr["faint"]        =  2
g_attr["standout"]     =  3
g_attr["underline"]    =  4
g_attr["blink"]        =  5
g_attr["overline"]     =  6  # Why is overline actually useful?
g_attr["reverse"]      =  7
g_attr["invisible"]    =  8

g_attr["no-attr"]      = 22
g_attr["no-standout"]  = 23
g_attr["no-underline"] = 24
g_attr["no-blink"]     = 25
g_attr["no-overline"]  = 26
g_attr["no-reverse"]   = 27
# 28 isn't defined?
# 29 isn't defined?
g_attr["black"]        = 30
g_attr["red"]          = 31
g_attr["green"]        = 32
g_attr["yellow"]       = 33
g_attr["blue"]         = 34
g_attr["magenta"]      = 35
g_attr["cyan"]         = 36
g_attr["white"]        = 37
# 38 isn't defined?
g_attr["default"]      = 39
g_attr["bg_black"]     = 40
g_attr["bg_red"]       = 41
g_attr["bg_green"]     = 42
g_attr["bg_yellow"]    = 43
g_attr["bg_blue"]      = 44
g_attr["bg_magenta"]   = 45
g_attr["bg_cyan"]      = 46
g_attr["bg_white"]     = 47
g_attr["bg_default"]   = 49


# make_seq("blue", "black", "normal")
def color(fg, bg="default", attr=["normal"]):
    mystr = esc_seq[:] + "%02d" % g_attr[fg]
    for x in [bg]+attr:
        mystr += ";%02d" % g_attr[x]
    return mystr+"m"



codes={}
codes["reset"]     = esc_seq + "39;49;00m"

codes["bold"]      = esc_seq + "01m"
codes["faint"]     = esc_seq + "02m"
codes["standout"]  = esc_seq + "03m"
codes["underline"] = esc_seq + "04m"
codes["blink"]     = esc_seq + "05m"
codes["overline"]  = esc_seq + "06m"  # Who made this up? Seriously.

codes["teal"]      = esc_seq + "36m"
codes["turquoise"] = esc_seq + "36;01m"

codes["fuchsia"]   = esc_seq + "35;01m"
codes["purple"]    = esc_seq + "35m"

codes["blue"]      = esc_seq + "34;01m"
codes["darkblue"]  = esc_seq + "34m"

codes["green"]     = esc_seq + "32;01m"
codes["darkgreen"] = esc_seq + "32m"

codes["yellow"]    = esc_seq + "33;01m"
codes["brown"]     = esc_seq + "33m"

codes["red"]       = esc_seq + "31;01m"
codes["darkred"]   = esc_seq + "31m"

def nc_len(mystr):
    tmp = re.sub(esc_seq + "^m]+m", "", mystr);
    return len(tmp)

def xtermTitle(mystr):
    if havecolor and dotitles and os.environ.has_key("TERM") and sys.stderr.isatty():
        myt=os.environ["TERM"]
        legal_terms = ["xterm","Eterm","aterm","rxvt","screen","kterm","rxvt-unicode"]
        for term in legal_terms:
            if myt.startswith(term):
                sys.stderr.write("\x1b]2;"+str(mystr)+"\x07")
                sys.stderr.flush()
                break

def xtermTitleReset():
    if havecolor and dotitles and os.environ.has_key("TERM"):
        myt=os.environ["TERM"]
        xtermTitle(os.environ["TERM"])


def notitles():
    "turn off title setting"
    dotitles=0

def nocolor():
    "turn off colorization"
    havecolor=0
    for x in codes.keys():
        codes[x]=""

def resetColor():
    return codes["reset"]

def ctext(color,text):
    return codes[ctext]+text+codes["reset"]

def bold(text):
    return codes["bold"]+text+codes["reset"]

def faint(text):
    return codes["faint"]+text+codes["reset"]

def white(text):
    return bold(text)

def teal(text):
    return codes["teal"]+text+codes["reset"]
def turquoise(text):
    return codes["turquoise"]+text+codes["reset"]
def darkteal(text):
    return turquoise(text)

def fuscia(text): # Don't use this one. It's spelled wrong!
    return codes["fuchsia"]+text+codes["reset"]
def fuchsia(text):
    return codes["fuchsia"]+text+codes["reset"]
def purple(text):
    return codes["purple"]+text+codes["reset"]

def blue(text):
    return codes["blue"]+text+codes["reset"]
def darkblue(text):
    return codes["darkblue"]+text+codes["reset"]

def green(text):
    return codes["green"]+text+codes["reset"]
def darkgreen(text):
    return codes["darkgreen"]+text+codes["reset"]

def yellow(text):
    return codes["yellow"]+text+codes["reset"]
def brown(text):
    return codes["brown"]+text+codes["reset"]
def darkyellow(text):
    return brown(text)

def red(text):
    return codes["red"]+text+codes["reset"]
def darkred(text):
    return codes["darkred"]+text+codes["reset"]


def update_basic_spinner():
    global spinner, spinpos
    spinpos = (spinpos+1) % 500
    if (spinpos % 100) == 0:
        if spinpos == 0:
            sys.stdout.write(". ")
        else:
            sys.stdout.write(".")
    sys.stdout.flush()

def update_scroll_spinner():
    global spinner, spinpos
    if(spinpos >= len(spinner)):
        sys.stdout.write(darkgreen(" \b\b\b"+spinner[len(spinner)-1-(spinpos%len(spinner))]))
    else:
        sys.stdout.write(green("\b "+spinner[spinpos]))
    sys.stdout.flush()
    spinpos = (spinpos+1) % (2*len(spinner))


def update_spinner():
    global spinner, spinpos
    spinpos = (spinpos+1) % len(spinner)
    sys.stdout.write("\b\b "+spinner[spinpos])
    sys.stdout.flush()
